Thuật toán Thuật_toán_Ford–Fulkerson

Cho một đồ thị G ( V , E ) {\displaystyle G(V,E)} , với các khả năng thông qua c ( u , v ) {\displaystyle c(u,v)} và luồng f ( u , v ) = 0 {\displaystyle f(u,v)=0} trên các cung từ u {\displaystyle u} đến v {\displaystyle v} , ta muốn tìm luồng cực đại từ đầu nguồn s {\displaystyle s} đến điểm thoát t {\displaystyle t} . Sau mỗi bước, các điều kiện sau đây được duy trì:

  •   f ( u , v ) ≤ c ( u , v ) {\displaystyle \ f(u,v)\leq c(u,v)} . Luồng từ u {\displaystyle u} tới v {\displaystyle v} không vượt quá khả năng thông qua.
  •   f ( u , v ) = − f ( v , u ) {\displaystyle \ f(u,v)=-f(v,u)} . Ta duy trì cân bằng luồng.
  •   ∑ v f ( u , v ) = 0 {\displaystyle \ \sum _{v}f(u,v)=0} cho tất cả các nút ngoại trừ s {\displaystyle s} và t {\displaystyle t} . Lượng dòng chảy vào một nút bằng lượng chảy ra khỏi một nút.

Điều này có nghĩa là một luồng đi qua một mạng là một luồng hợp lệ sau mỗi vòng của thuật toán. Chúng ta định nghĩa mạng còn dư G f ( V , E f ) {\displaystyle G_{f}(V,E_{f})} là mạng với sức chứa c f ( u , v ) = c ( u , v ) − f ( u , v ) {\displaystyle c_{f}(u,v)=c(u,v)-f(u,v)} và luồng bằng không. Chú ý rằng không chắc chắn là E = E f {\displaystyle E=E_{f}} , bởi vì việc gửi luồng theo cung u , v {\displaystyle u,v} có thể làm ngắt u , v {\displaystyle u,v} (làm nó bão hòa), nhưng lại mở một cung mới v , u {\displaystyle v,u} trong mạng còn dư.

Đầu vào: Đồ thị G với khả năng thông qua c, một nút nguồn s, và một nút thoát tKết quả: Luồng f sao cho f là cực đại từ s đến t
  1. f ( u , v ) ← 0 {\displaystyle f(u,v)\leftarrow 0} trên tất cả các cung u , v {\displaystyle u,v}
  2. Trong khi còn có một đường đi từ s {\displaystyle s} đến t {\displaystyle t} trong G f {\displaystyle G_{f}} :
    1. Tìm một đường đi u 1 , u 2 , … , u k {\displaystyle u_{1},u_{2},\dots ,u_{k}} với u 1 = s {\displaystyle u_{1}=s} và u k = t {\displaystyle u_{k}=t} , sao cho c f ( u i , u i + 1 ) > 0 {\displaystyle c_{f}(u_{i},u_{i+1})>0}
    2. Tìm m = min ( c f ( u i , u i + 1 ) ) {\displaystyle m=\min(c_{f}(u_{i},u_{i+1}))}
    3. f ( u i , u i + 1 ) ← f ( u i , u i + 1 ) + m {\displaystyle f(u_{i},u_{i+1})\leftarrow f(u_{i},u_{i+1})+m} (gửi luồng dọc theo đường đi)
    4. f ( u i + 1 , u i ) ← f ( u i + 1 , u i ) − m {\displaystyle f(u_{i+1},u_{i})\leftarrow f(u_{i+1},u_{i})-m} (luồng có thể "quay lại" sau)

Có thể tìm đường đi trong G f ( V , E f ) {\displaystyle G_{f}(V,E_{f})} bằng các phương pháp chẳng hạn như tìm kiếm theo chiều rộng (breadth-first-search) hoặc tìm kiếm theo chiều sâu (depth-first-search). Nếu sử dụng cách thứ nhất, thuật toán sẽ được gọi là Edmonds-Karp.